# Курс молодого бойца Тимофея Хирьянова `МФТИ`

## Генерация арифметических и геометрических прогрессий

`2024.05.11`

```C
#include <stdio.h>

int main(void) {
    int start, stop, step;
    scanf("%d%d%d", &start, &stop, &step);
    int sign = (step > 0) ? 1 : -1;
    int x = start;
    // endless loop with 0 value and negative step
    while (sign*x < sign*stop) {
        printf("%d\n", x);
        x += step;
    }
    printf("Final: %d\n", x);

    return 0;
}
```

---

## Циклы FOR и WHILE: сходство и различие

`2024.05.11`

Поток исполнения программы: последовательно строчка за строчкой

Во многих случаях потребуется зациклить ряд действий

**Итарация** - однократное исполнение серии команд в цикле

**Тело цикла** – сама последовательность команд

```C
int i = 0;
while (i < 10) {
    printf("%d", i);
    ++i;
}
```

Количество итерация в while-цикле <u>заранее неизвестно</u>

For-цикл в языке Си является так называемым <u>синтаксическим сахаром</u>. Он не нужен языку Си для полноты. Но он удобен

```C
for (int i = 0; i < 10; ++i) {
    printf("%d", i);
}
```

For-цикл состоит из 3 частей (каждая – необязательна, но точки с запятыми – обязательны):

1. инициализация `int i = 0;`
2. условие вхождение на каждую итерацию `i < 10;`
3. инкрементация (что сделать после выполнения тела цикла) `++i`

For-цикл просто более компактен. Он, также как и while, может бесконечно зациклиться

---

## Переполнение и ошибки при работе с целыми типами в Си

`2024.05.09-10`

**Переполнение/overflow**

	== Вымышленный 3-битный беззнаковый тип `uint3_t` ==
    == диапазон допустимых значений 0…7 ==
	0b000 = 0
	0b001 = 1
	0b010 = 2
	0b011 = 3
	0b100 = 4
	0b101 = 5
	0b110 = 6
	0b111 = 7
    == мат.: кольцо вычетов по модулю 8 (восемь) ==

**Переполнение вниз/underflow** – например, из нуля вычитаем единицу

    == вымышленный 3-битный знаковый тип `int3_t` ==
    == диапазон допустимых значений -4…3 ==
    0b000 = 0
    0b001 = 1
    0b010 = 2
    0b011 = 3
    0b100 = -4
    0b101 = -3
    0b110 = -2
    0b111 = -1
    == 3+1=-4??!! ==

[целочисленное переполнение (Википедия)](https://ru.wikipedia.org/wiki/Целочисленное_переполнение)

**4 базовых типа в Си** - char, int, double, bool (подключается через инклуд <stdbool.h>

signed/unsigned = знаковый/беззнаковый
long long/long/short = увеличение/уменьшение количества байт для хранения переменной (но без гарантий)
Поэтому настоятельно рекомендуется использовать библиотеку `inttypes.h`

```C
#include <stdio.h>
#include <inttypes.h>

int main(int argc, char* argv[]) {
    unsigned char c;
    int8_t i8;
    int16_t i16;
    int32_t i32;
    int64_t i64;

    return 0;
}
```

Переполнение и переполнения вниз – это не ошибки, а реальность бытия переменных фиксированной длины

В языке Си преобразования типов часто происходят <u>неявно</u>

```C
#include <stdio.h>

int main(int argc, char* argv[]) {
    int x = -100;
    unsigned int y = 10U;
    long long int z = x + y;
    printf("z = %lld\n", z);

    char c = 'Я';
    int d = (int)c * 10 + y;
    printf("d = %d\n", d);

    return 0;
}
```

---

## Этапы компиляции на Си: предобработка, трансляция, компоновка

`2024.05.09`

препроцессинг (предобработка) —> компиляция (трансляция) —> линковка (сборка)

```console
# произведет предобработку
gcc -E preprocessing.c > preprocessing_prep.c
```

```console
# произведет трансляция
gcc -c preprocessing_prep.c
# на выходе будет файл preprocessing_prep.o (объектный файл)
```

```console
# производим сборку из объектного файла
gcc preprocessing_prep.o -o prep.out
```


